perm filename TEMP.TEM[TEX,ALS] blob sn#596768 filedate 1981-07-02 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	PROCEDURE CHECKMEM(PRINTLOCS:BOOLEAN)
C00005 00003	FUNCTION GETNODE(SIZE: INTEGER):
C00010 ENDMK
CāŠ—;
PROCEDURE CHECKMEM(PRINTLOCS:BOOLEAN);
LABEL 0, 1;
VAR P,I: INTEGER;
BEGIN
FOR I:=0 TO 49151 DO FREE[I]:=FALSE;
P:=MEM[49152].TWOHALVES.LHWORD;
WHILE P<>0 DO
    BEGIN
    IF(MEM[P].TWOHALVES.LHWORD>=49152)
      OR FREE[P] OR((MEM[P].TWOHALVES.LHWORD<>0)
      AND(MEM[P].TWOHALVES.LHWORD<=25000)) THEN
	BEGIN PRINTLN(134);		(* AVAIL LIST CLOBBERED AT *)
	PRINTINT(P);
	GOTO 0;
	END;
    FREE[P]:=TRUE;
    P:=MEM[P].TWOHALVES.LHWORD;
    END;
0:

P:=ROVER;
REPEAT
IF(P>=25000) OR(P<=0) OR(NOT(MEM[P].TWOHALVES.RHWORD=65535))
  OR(P+MEM[P+1].TWOHALVES.RHWORD>25000)
  OR(MEM[P+1].TWOHALVES.RHWORD<2)
  OR(MEM[MEM[P].TWOHALVES.LHWORD+1].TWOHALVES.LHWORD<>P) THEN
    BEGIN
    PRINTLN(135);			(* DOUBLE AVAIL LIST CLOBBERED AT *)
    PRINTINT(P);
    PRINTLN(136);			(* TYP *)
    PRINTINT(MEM[P].TWOHALVES.BYTE2);
    PRINTLN(137);			(* NODESIZE *)
    PRINTINT(MEM[P+1].TWOHALVES.RHWORD);
    PRINTLN(138);			(* RLINK *)
    PRINTINT(MEM[P].TWOHALVES.LHWORD);
    PRINTLN(139);			(* LLLINK OF RLINK *)
    PRINTINT(MEM[MEM[P].TWOHALVES.LHWORD+1].TWOHALVES.LHWORD);
    GOTO 1;
    END;
FOR I:=P TO(P+MEM[P+1].TWOHALVES.RHWORD-1) DO
    BEGIN IF FREE[I] THEN
	BEGIN
	PRINTLN(140);			(* DOUBLE FREE LOCATION AT *)
	PRINTINT(I);
	GOTO 1;
	END;
    FREE[I]:=TRUE
    END;
P:=MEM[P].TWOHALVES.LHWORD
UNTIL P=ROVER;
1:
IF PRINTLOCS THEN
    BEGIN I:=0;
    WHILE I<25000 DO
	BEGIN IF(MEM[I].TWOHALVES.RHWORD=65535) THEN
	    BEGIN
	    PRINTLN(141);		(* NODE *)
	    PRINTINT(I);
	    PRINT(142);			(* IS FREE	SIZE *)
	    PRINTINT(MEM[I+1].TWOHALVES.RHWORD);
	    END;
	I:=I+1;
	WHILE(I<25000) AND(NOT FREE[I])
	DO I:=I+1
	END;
    PRINTLN(143);			(* NEW BUSY LOCS *)
    END;
FOR I:=0 TO 49151 DO
    BEGIN 
    IF WASFREE[I] AND(NOT FREE[I]) AND PRINTLOCS THEN
    PRINTINT(I);
    WASFREE[I]:=FREE[I]
    END
END;
FUNCTION GETNODE(SIZE: INTEGER):
INTEGER;
LABEL 0, 1;
VAR P:INTEGER;
Q:INTEGER;
S: INTEGER;
BEGIN
P:= ROVER;		(*Points to  double available list*)
REPEAT
    BEGIN
    Q:=P+MEM[P+1].TWOHALVES.RHWORD;
    WHILE(MEM[Q].TWOHALVES.RHWORD=65535) DO
	BEGIN
	IF(Q=ROVER) THEN
	    BEGIN 
	    ROVER:=MEM[Q].TWOHALVES.LHWORD;
	    IF(Q=ROVER) THEN GOTO 0
	    END;
	MEM[MEM[Q].TWOHALVES.LHWORD+1].TWOHALVES.LHWORD:=
						MEM[Q+1].TWOHALVES.LHWORD;
	MEM[MEM[Q+1].TWOHALVES.LHWORD].TWOHALVES.LHWORD:=
						MEM[Q].TWOHALVES.LHWORD;
	MEM[Q].TWOHALVES.RHWORD:=0;
	Q:=Q+MEM[Q+1].TWOHALVES.RHWORD
	END;
    S:=Q-P;
    IF S>=SIZE+2 THEN 
	BEGIN 
	Q:=Q-SIZE;
	MEM[P+1].TWOHALVES.RHWORD:=Q-P;
	ROVER:=P;
	GOTO 1
	END;
    IF S=SIZE THEN 
	BEGIN
	IF(P=ROVER) THEN
	    BEGIN 
	    ROVER:=MEM[P].TWOHALVES.LHWORD;
	    IF(P=ROVER) THEN GOTO 0
	    END;
	MEM[MEM[P].TWOHALVES.LHWORD+1].TWOHALVES.LHWORD:=
						MEM[P+1].TWOHALVES.LHWORD;
	MEM[MEM[P+1].TWOHALVES.LHWORD].TWOHALVES.LHWORD:=
						MEM[P].TWOHALVES.LHWORD;
	MEM[P].TWOHALVES.RHWORD:=0;
	ROVER:=MEM[P].TWOHALVES.LHWORD;
	Q:=P;
	GOTO 1
	END;
    MEM[P+1].TWOHALVES.RHWORD:=S;
    P:=MEM[P].TWOHALVES.LHWORD
    END;
UNTIL P=ROVER;
0:
OVERFLOW(132,25000);
1:
WITH MEM[Q].TWOHALVES DO 
    BEGIN RHWORD:=0;
    LHWORD:=0 END;
MEM[Q+1].TWOHALVES.LHWORD:=0;
GETNODE:=Q;(* VARUSED:=VARUSED+SIZE;*)
END;

PROCEDURE FREENODE(P,SIZE: INTEGER);
VAR Q:INTEGER;
BEGIN
Q:=MEM[ROVER+1].TWOHALVES.LHWORD;
MEM[P+1].TWOHALVES.LHWORD:=Q;
MEM[P].TWOHALVES.LHWORD:=ROVER;
MEM[P+1].TWOHALVES.RHWORD:=SIZE;
MEM[P].TWOHALVES.RHWORD:=65535;
MEM[ROVER+1].TWOHALVES.LHWORD:=P;
MEM[Q].TWOHALVES.LHWORD:=P;(*
	 VARUSED:=VARUSED-SIZE;*)
END;

FUNCTION GETAVAIL: INTEGER;
VAR P: INTEGER;
BEGIN
P:=MEM[49152].TWOHALVES.LHWORD;
IF P<>0 THEN MEM[49152].TWOHALVES
	.LHWORD:=MEM[MEM[49152].TWOHALVES.LHWORD].TWOHALVES.LHWORD
	
ELSE OVERFLOW(133,49152);
MEM[P].TWOHALVES.LHWORD:=0;
GETAVAIL:=P;(* DYNUSED:=DYNUSED+1;*)
	
END;

PROCEDURE FREEAVAIL(P: INTEGER);
BEGIN
IF P<25012 THEN FREENODE(P,2)
	
ELSE BEGIN MEM[P].TWOHALVES.LHWORD:=MEM[49152].TWOHALVES.LHWORD;
MEM[49152].TWOHALVES.LHWORD:=P;(*
	 DYNUSED:=DYNUSED-1;*)
END
END;

PROCEDURE DSLIST(P: INTEGER);
VAR Q:INTEGER;
BEGIN
WHILE P<>0 DO
    BEGIN Q:=MEM[P].TWOHALVES.LHWORD;
    FREEAVAIL(P);
    P:=Q
    END
END;

PROCEDURE DELRCLINK(P: INTEGER);
BEGIN
IF MEM[P].TWOHALVES.RHWORD>0 THEN
	 MEM[P].TWOHALVES.RHWORD:=MEM[P].TWOHALVES.RHWORD-1
	
ELSE DSLIST(P)
END;

PROCEDURE DELGLUELINK(P: INTEGER);
BEGIN
IF MEM[P].TWOHALVES.RHWORD>0 THEN
	 MEM[P].TWOHALVES.RHWORD:=MEM[P].TWOHALVES.RHWORD-1
	
ELSE FREENODE(P,4)
END;